import matplotlib.pyplot as plt
import numpy as np
import sympy as sp
 
from sympy.utilities.lambdify import lambdify
#-----------------------------连续数值离散化-便于绘图------------------------------------
def Curve_values(piecewise_function):
 
    derivative_func = lambdify(x, piecewise_function, 'numpy')
    # 创建x值向量并计算导数值
    derivative_values = derivative_func(x_values)
 
    return derivative_values
 
###########################绘制、美化坐标轴函数(start)################################################
'''
index:要绘制在第几行第几列,
由于在前面定义的是plt.subplots(3, 1)
也就是说只有一列，所以是axes[index]，
表示在该单列的第几行画这个图。
如果在前面定义的是plt.subplots(3,2)
那么就会是axes[index_x][index_y]
表示在第几行第几列画这个图。
func:要绘制的函数名称
Curve_name:曲线名称
x_name:x轴名称
y_name:y轴名称
'''

def axes_draw_part(index,func,Curve_name,x_name,y_name):
    axes[index].set_xticks([0, 4, 10,17,20,24])
    axes[index].set_yticks([0, 72,240,338,320,272])  
    axes[index].plot(x_values, Curve_values(func), 'b', label = Curve_name)
    axes[index].set_xlabel(x_name)
    axes[index].set_ylabel(y_name)
    axes[index].legend()
    axes[index].grid(True)


def axes_draw(index,func,Curve_name,x_name,y_name):
    axes[index].plot(x_values, Curve_values(func), 'b', label = Curve_name)
    axes[index].set_xlabel(x_name)
    axes[index].set_ylabel(y_name)
    axes[index].legend()
    axes[index].grid(True)
 
 
def beautify_axes(index,x_lower_limit,x_upper_limit,xloc_count,y_lower_limit,y_upper_limit,yloc_count):
    axes[index].spines['right'].set_color('none')   # 将图像右边的轴设为透明
    axes[index].spines['top'].set_color('none')     # 将图像上面的轴设为透明
    axes[index].xaxis.set_ticks_position('bottom')    # 将x轴刻度设在下面的坐标轴上
    axes[index].yaxis.set_ticks_position('left')         # 将y轴刻度设在左边的坐标轴上
    axes[index].spines['bottom'].set_position(('data', 0))   # 将两个坐标轴的位置设在数据点原点
    axes[index].spines['left'].set_position(('data', 0))
    # print("进入beautify：",type(axes))
    axes[index].set_xticks( np.linspace(x_lower_limit,x_upper_limit,xloc_count))
    axes[index].set_yticks( np.linspace(y_lower_limit,y_upper_limit,yloc_count))
'''
    axes[index].set_xticks(np.linspace(下限,上限,n))
    刻度设置的用法是(下限,上限）标记上n个 刻度 ，也就是n-1等分
 '''
################################绘制、美化坐标轴函数(end)###########################################
 
if __name__ == '__main__':
    length=24#x轴的长度
    x_slices=25
    #-----------------------------分段函数S-t、V-t、a-t(Start)定义------------------------------------
    x = sp.symbols('x')
    s_t = sp.Piecewise((2.5*x**2+8*x,          sp.And(x>=0,x<4)),
                         (28*(x-4)+72,             sp.And(x>=4,x<10)),
                        (-2*x**2+68*x-240,sp.And(x>10,x<=20)),
                        (-12*x+560,sp.And(x>20)))
    #位移曲线
    
    v_t = sp.diff(s_t, x)#速度曲线    
    a_t = sp.diff(v_t, x)#加速度曲线    
    
    #-----------------------------分段函数S-t、V-t、a-t(End)------------------------------------
    
    #-----------------------------x轴定义域----------------------------
    left=0
    right=length#设定离散点的显示范围
    x_values = np.linspace(left, right, 1000)#这个1000个曲线上的点，并不是刻度上的点
    #----------------------------------------------------------------------
 
    fig, axes = plt.subplots(3, 1, figsize = (8, 7))#两行两列总共4个图
    
    #############################绘制s-t##############################################
    index=0
    Curve_name='s-t Curve'
    x_name='Time(s)'
    y_name='Displacement(m)'
    axes_draw_part(index,s_t,Curve_name,x_name,y_name)
    # axes_draw_part(index,s_t,Curve_name,x_name,y_name)
    # beautify_axes(index,0,length,x_slices,0,320,17)
    '''
    x轴范围在[0,x_slices],x_slices个刻度(x_slices-1等分)
    y轴范围在[0,600]，16个刻度(15等分)
    '''
################################绘制v-t###########################################
    index=1
    Curve_name='v-t Curve'
    x_name='Time(s)'
    y_name='Velocity(m/s)'
    axes_draw(index,v_t,Curve_name,x_name,y_name)
    beautify_axes(index,0,length,x_slices,-12,28,11)
    '''
    x轴范围在[0,length],x_slices个刻度(x_slices-1个等分)
    y轴范围在[0,8]，9个刻度(8等分)
    '''
    ################################绘制a-t###########################################
    index=2
    Curve_name='a-t Curve'
    x_name='Time(s)'
    y_name='Acceleration(m/s2)'
    axes_draw(index,a_t,Curve_name,x_name,y_name)
    beautify_axes(index,0,length,x_slices,-4,5,10)
    #y轴显示范围是[-0.2,0.8],6个刻度线，划分为五块
    # 因为0.8-(-0.2)=1m/s^2划分为5个比较合适
    
    # plt.grid(True)
    plt.show()
